home *** CD-ROM | disk | FTP | other *** search
/ Freelog 125 / Freelog_MarsAvril2015_No125.iso / Musique / Quod Libet / quodlibet-3.3.0-installer.exe / bin / pyHook / HookManager.pyc (.txt) < prev   
Python Compiled Bytecode  |  2014-12-31  |  26KB  |  832 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.7)
  3.  
  4. import cpyHook
  5.  
  6. def GetKeyState(key_id):
  7.     return cpyHook.cGetKeyState(key_id)
  8.  
  9.  
  10. class HookConstants:
  11.     '''
  12.   Stores internal windows hook constants including hook types, mappings from virtual
  13.   keycode name to value and value to name, and event type value to name.
  14.   '''
  15.     WH_MIN = -1
  16.     WH_MSGFILTER = -1
  17.     WH_JOURNALRECORD = 0
  18.     WH_JOURNALPLAYBACK = 1
  19.     WH_KEYBOARD = 2
  20.     WH_GETMESSAGE = 3
  21.     WH_CALLWNDPROC = 4
  22.     WH_CBT = 5
  23.     WH_SYSMSGFILTER = 6
  24.     WH_MOUSE = 7
  25.     WH_HARDWARE = 8
  26.     WH_DEBUG = 9
  27.     WH_SHELL = 10
  28.     WH_FOREGROUNDIDLE = 11
  29.     WH_CALLWNDPROCRET = 12
  30.     WH_KEYBOARD_LL = 13
  31.     WH_MOUSE_LL = 14
  32.     WH_MAX = 15
  33.     WM_MOUSEFIRST = 512
  34.     WM_MOUSEMOVE = 512
  35.     WM_LBUTTONDOWN = 513
  36.     WM_LBUTTONUP = 514
  37.     WM_LBUTTONDBLCLK = 515
  38.     WM_RBUTTONDOWN = 516
  39.     WM_RBUTTONUP = 517
  40.     WM_RBUTTONDBLCLK = 518
  41.     WM_MBUTTONDOWN = 519
  42.     WM_MBUTTONUP = 520
  43.     WM_MBUTTONDBLCLK = 521
  44.     WM_MOUSEWHEEL = 522
  45.     WM_MOUSELAST = 522
  46.     WM_KEYFIRST = 256
  47.     WM_KEYDOWN = 256
  48.     WM_KEYUP = 257
  49.     WM_CHAR = 258
  50.     WM_DEADCHAR = 259
  51.     WM_SYSKEYDOWN = 260
  52.     WM_SYSKEYUP = 261
  53.     WM_SYSCHAR = 262
  54.     WM_SYSDEADCHAR = 263
  55.     WM_KEYLAST = 264
  56.     vk_to_id = {
  57.         'VK_LBUTTON': 1,
  58.         'VK_RBUTTON': 2,
  59.         'VK_CANCEL': 3,
  60.         'VK_MBUTTON': 4,
  61.         'VK_BACK': 8,
  62.         'VK_TAB': 9,
  63.         'VK_CLEAR': 12,
  64.         'VK_RETURN': 13,
  65.         'VK_SHIFT': 16,
  66.         'VK_CONTROL': 17,
  67.         'VK_MENU': 18,
  68.         'VK_PAUSE': 19,
  69.         'VK_CAPITAL': 20,
  70.         'VK_KANA': 21,
  71.         'VK_HANGEUL': 21,
  72.         'VK_HANGUL': 21,
  73.         'VK_JUNJA': 23,
  74.         'VK_FINAL': 24,
  75.         'VK_HANJA': 25,
  76.         'VK_KANJI': 25,
  77.         'VK_ESCAPE': 27,
  78.         'VK_CONVERT': 28,
  79.         'VK_NONCONVERT': 29,
  80.         'VK_ACCEPT': 30,
  81.         'VK_MODECHANGE': 31,
  82.         'VK_SPACE': 32,
  83.         'VK_PRIOR': 33,
  84.         'VK_NEXT': 34,
  85.         'VK_END': 35,
  86.         'VK_HOME': 36,
  87.         'VK_LEFT': 37,
  88.         'VK_UP': 38,
  89.         'VK_RIGHT': 39,
  90.         'VK_DOWN': 40,
  91.         'VK_SELECT': 41,
  92.         'VK_PRINT': 42,
  93.         'VK_EXECUTE': 43,
  94.         'VK_SNAPSHOT': 44,
  95.         'VK_INSERT': 45,
  96.         'VK_DELETE': 46,
  97.         'VK_HELP': 47,
  98.         'VK_LWIN': 91,
  99.         'VK_RWIN': 92,
  100.         'VK_APPS': 93,
  101.         'VK_NUMPAD0': 96,
  102.         'VK_NUMPAD1': 97,
  103.         'VK_NUMPAD2': 98,
  104.         'VK_NUMPAD3': 99,
  105.         'VK_NUMPAD4': 100,
  106.         'VK_NUMPAD5': 101,
  107.         'VK_NUMPAD6': 102,
  108.         'VK_NUMPAD7': 103,
  109.         'VK_NUMPAD8': 104,
  110.         'VK_NUMPAD9': 105,
  111.         'VK_MULTIPLY': 106,
  112.         'VK_ADD': 107,
  113.         'VK_SEPARATOR': 108,
  114.         'VK_SUBTRACT': 109,
  115.         'VK_DECIMAL': 110,
  116.         'VK_DIVIDE': 111,
  117.         'VK_F1': 112,
  118.         'VK_F2': 113,
  119.         'VK_F3': 114,
  120.         'VK_F4': 115,
  121.         'VK_F5': 116,
  122.         'VK_F6': 117,
  123.         'VK_F7': 118,
  124.         'VK_F8': 119,
  125.         'VK_F9': 120,
  126.         'VK_F10': 121,
  127.         'VK_F11': 122,
  128.         'VK_F12': 123,
  129.         'VK_F13': 124,
  130.         'VK_F14': 125,
  131.         'VK_F15': 126,
  132.         'VK_F16': 127,
  133.         'VK_F17': 128,
  134.         'VK_F18': 129,
  135.         'VK_F19': 130,
  136.         'VK_F20': 131,
  137.         'VK_F21': 132,
  138.         'VK_F22': 133,
  139.         'VK_F23': 134,
  140.         'VK_F24': 135,
  141.         'VK_NUMLOCK': 144,
  142.         'VK_SCROLL': 145,
  143.         'VK_LSHIFT': 160,
  144.         'VK_RSHIFT': 161,
  145.         'VK_LCONTROL': 162,
  146.         'VK_RCONTROL': 163,
  147.         'VK_LMENU': 164,
  148.         'VK_RMENU': 165,
  149.         'VK_PROCESSKEY': 229,
  150.         'VK_ATTN': 246,
  151.         'VK_CRSEL': 247,
  152.         'VK_EXSEL': 248,
  153.         'VK_EREOF': 249,
  154.         'VK_PLAY': 250,
  155.         'VK_ZOOM': 251,
  156.         'VK_NONAME': 252,
  157.         'VK_PA1': 253,
  158.         'VK_OEM_CLEAR': 254,
  159.         'VK_BROWSER_BACK': 166,
  160.         'VK_BROWSER_FORWARD': 167,
  161.         'VK_BROWSER_REFRESH': 168,
  162.         'VK_BROWSER_STOP': 169,
  163.         'VK_BROWSER_SEARCH': 170,
  164.         'VK_BROWSER_FAVORITES': 171,
  165.         'VK_BROWSER_HOME': 172,
  166.         'VK_VOLUME_MUTE': 173,
  167.         'VK_VOLUME_DOWN': 174,
  168.         'VK_VOLUME_UP': 175,
  169.         'VK_MEDIA_NEXT_TRACK': 176,
  170.         'VK_MEDIA_PREV_TRACK': 177,
  171.         'VK_MEDIA_STOP': 178,
  172.         'VK_MEDIA_PLAY_PAUSE': 179,
  173.         'VK_LAUNCH_MAIL': 180,
  174.         'VK_LAUNCH_MEDIA_SELECT': 181,
  175.         'VK_LAUNCH_APP1': 182,
  176.         'VK_LAUNCH_APP2': 183,
  177.         'VK_OEM_1': 186,
  178.         'VK_OEM_PLUS': 187,
  179.         'VK_OEM_COMMA': 188,
  180.         'VK_OEM_MINUS': 189,
  181.         'VK_OEM_PERIOD': 190,
  182.         'VK_OEM_2': 191,
  183.         'VK_OEM_3': 192,
  184.         'VK_OEM_4': 219,
  185.         'VK_OEM_5': 220,
  186.         'VK_OEM_6': 221,
  187.         'VK_OEM_7': 222,
  188.         'VK_OEM_8': 223,
  189.         'VK_OEM_102': 226,
  190.         'VK_PROCESSKEY': 229,
  191.         'VK_PACKET': 231 }
  192.     id_to_vk = dict([ (v, k) for k, v in vk_to_id.items() ])
  193.     msg_to_name = {
  194.         WM_MOUSEMOVE: 'mouse move',
  195.         WM_LBUTTONDOWN: 'mouse left down',
  196.         WM_LBUTTONUP: 'mouse left up',
  197.         WM_LBUTTONDBLCLK: 'mouse left double',
  198.         WM_RBUTTONDOWN: 'mouse right down',
  199.         WM_RBUTTONUP: 'mouse right up',
  200.         WM_RBUTTONDBLCLK: 'mouse right double',
  201.         WM_MBUTTONDOWN: 'mouse middle down',
  202.         WM_MBUTTONUP: 'mouse middle up',
  203.         WM_MBUTTONDBLCLK: 'mouse middle double',
  204.         WM_MOUSEWHEEL: 'mouse wheel',
  205.         WM_KEYDOWN: 'key down',
  206.         WM_KEYUP: 'key up',
  207.         WM_CHAR: 'key char',
  208.         WM_DEADCHAR: 'key dead char',
  209.         WM_SYSKEYDOWN: 'key sys down',
  210.         WM_SYSKEYUP: 'key sys up',
  211.         WM_SYSCHAR: 'key sys char',
  212.         WM_SYSDEADCHAR: 'key sys dead char' }
  213.     
  214.     def MsgToName(cls, msg):
  215.         '''
  216.     Class method. Converts a message value to message name.
  217.  
  218.     @param msg: Keyboard or mouse event message
  219.     @type msg: integer
  220.     @return: Name of the event
  221.     @rtype: string
  222.     '''
  223.         return HookConstants.msg_to_name.get(msg)
  224.  
  225.     
  226.     def VKeyToID(cls, vkey):
  227.         '''
  228.     Class method. Converts a virtual keycode name to its value.
  229.  
  230.     @param vkey: Virtual keycode name
  231.     @type vkey: string
  232.     @return: Virtual keycode value
  233.     @rtype: integer
  234.     '''
  235.         return HookConstants.vk_to_id.get(vkey)
  236.  
  237.     
  238.     def IDToName(cls, code):
  239.         '''
  240.     Class method. Gets the keycode name for the given value.
  241.  
  242.     @param code: Virtual keycode value
  243.     @type code: integer
  244.     @return: Virtual keycode name
  245.     @rtype: string
  246.     '''
  247.         if (code >= 48 or code <= 57 or code >= 65) and code <= 90:
  248.             text = chr(code)
  249.         else:
  250.             text = HookConstants.id_to_vk.get(code)
  251.             if text is not None:
  252.                 text = text[3:].title()
  253.         return text
  254.  
  255.     MsgToName = classmethod(MsgToName)
  256.     IDToName = classmethod(IDToName)
  257.     VKeyToID = classmethod(VKeyToID)
  258.  
  259.  
  260. class HookEvent(object):
  261.     '''
  262.   Holds information about a general hook event.
  263.  
  264.   @ivar Message: Keyboard or mouse event message
  265.   @type Message: integer
  266.   @ivar Time: Seconds since the epoch when the even current
  267.   @type Time: integer
  268.   @ivar Window: Window handle of the foreground window at the time of the event
  269.   @type Window: integer
  270.   @ivar WindowName: Name of the foreground window at the time of the event
  271.   @type WindowName: string
  272.   '''
  273.     
  274.     def __init__(self, msg, time, hwnd, window_name):
  275.         '''Initializes an event instance.'''
  276.         self.Message = msg
  277.         self.Time = time
  278.         self.Window = hwnd
  279.         self.WindowName = window_name
  280.  
  281.     
  282.     def GetMessageName(self):
  283.         '''
  284.     @return: Name of the event
  285.     @rtype: string
  286.     '''
  287.         return HookConstants.MsgToName(self.Message)
  288.  
  289.     MessageName = property(fget = GetMessageName)
  290.  
  291.  
  292. class MouseEvent(HookEvent):
  293.     '''
  294.   Holds information about a mouse event.
  295.  
  296.   @ivar Position: Location of the mouse event on the screen
  297.   @type Position: 2-tuple of integer
  298.   @ivar Wheel: Positive if the wheel scrolls up, negative if down, zero otherwise
  299.   @type Wheel: integer
  300.   @ivar Injected: Was this event generated programmatically?
  301.   @type Injected: boolean
  302.   '''
  303.     
  304.     def __init__(self, msg, x, y, data, flags, time, hwnd, window_name):
  305.         '''Initializes an instance of the class.'''
  306.         HookEvent.__init__(self, msg, time, hwnd, window_name)
  307.         self.Position = (x, y)
  308.         if data > 0:
  309.             w = 1
  310.         elif data < 0:
  311.             w = -1
  312.         else:
  313.             w = 0
  314.         self.Wheel = w
  315.         self.Injected = flags & 1
  316.  
  317.  
  318.  
  319. class KeyboardEvent(HookEvent):
  320.     '''
  321.   Holds information about a mouse event.
  322.  
  323.   @ivar KeyID: Virtual key code
  324.   @type KeyID: integer
  325.   @ivar ScanCode: Scan code
  326.   @type ScanCode: integer
  327.   @ivar Ascii: ASCII value, if one exists
  328.   @type Ascii: string
  329.   '''
  330.     
  331.     def __init__(self, msg, vk_code, scan_code, ascii, flags, time, hwnd, window_name):
  332.         '''Initializes an instances of the class.'''
  333.         HookEvent.__init__(self, msg, time, hwnd, window_name)
  334.         self.KeyID = vk_code
  335.         self.ScanCode = scan_code
  336.         self.Ascii = ascii
  337.         self.flags = flags
  338.  
  339.     
  340.     def GetKey(self):
  341.         '''
  342.     @return: Name of the virtual keycode
  343.     @rtype: string
  344.     '''
  345.         return HookConstants.IDToName(self.KeyID)
  346.  
  347.     
  348.     def IsExtended(self):
  349.         '''
  350.     @return: Is this an extended key?
  351.     @rtype: boolean
  352.     '''
  353.         return self.flags & 1
  354.  
  355.     
  356.     def IsInjected(self):
  357.         '''
  358.     @return: Was this event generated programmatically?
  359.     @rtype: boolean
  360.     '''
  361.         return self.flags & 16
  362.  
  363.     
  364.     def IsAlt(self):
  365.         '''
  366.     @return: Was the alt key depressed?
  367.     @rtype: boolean
  368.     '''
  369.         return self.flags & 32
  370.  
  371.     
  372.     def IsTransition(self):
  373.         '''
  374.     @return: Is this a transition from up to down or vice versa?
  375.     @rtype: boolean
  376.     '''
  377.         return self.flags & 128
  378.  
  379.     Key = property(fget = GetKey)
  380.     Extended = property(fget = IsExtended)
  381.     Injected = property(fget = IsInjected)
  382.     Alt = property(fget = IsAlt)
  383.     Transition = property(fget = IsTransition)
  384.  
  385.  
  386. class HookManager(object):
  387.     '''
  388.   Registers and manages callbacks for low level mouse and keyboard events.
  389.  
  390.   @ivar mouse_funcs: Callbacks for mouse events
  391.   @type mouse_funcs: dictionary
  392.   @ivar keyboard_funcs: Callbacks for keyboard events
  393.   @type keyboard_funcs: dictionary
  394.   @ivar mouse_hook: Is a mouse hook set?
  395.   @type mouse_hook: boolean
  396.   @ivar key_hook: Is a keyboard hook set?
  397.   @type key_hook: boolean
  398.   '''
  399.     
  400.     def __init__(self):
  401.         '''Initializes an instance by setting up an empty set of handlers.'''
  402.         self.mouse_funcs = { }
  403.         self.keyboard_funcs = { }
  404.         self.mouse_hook = False
  405.         self.key_hook = False
  406.  
  407.     
  408.     def __del__(self):
  409.         '''Unhook all registered hooks.'''
  410.         self.UnhookMouse()
  411.         self.UnhookKeyboard()
  412.  
  413.     
  414.     def HookMouse(self):
  415.         '''Begins watching for mouse events.'''
  416.         cpyHook.cSetHook(HookConstants.WH_MOUSE_LL, self.MouseSwitch)
  417.         self.mouse_hook = True
  418.  
  419.     
  420.     def HookKeyboard(self):
  421.         '''Begins watching for keyboard events.'''
  422.         cpyHook.cSetHook(HookConstants.WH_KEYBOARD_LL, self.KeyboardSwitch)
  423.         self.keyboard_hook = True
  424.  
  425.     
  426.     def UnhookMouse(self):
  427.         '''Stops watching for mouse events.'''
  428.         if self.mouse_hook:
  429.             cpyHook.cUnhook(HookConstants.WH_MOUSE_LL)
  430.             self.mouse_hook = False
  431.  
  432.     
  433.     def UnhookKeyboard(self):
  434.         '''Stops watching for keyboard events.'''
  435.         if self.keyboard_hook:
  436.             cpyHook.cUnhook(HookConstants.WH_KEYBOARD_LL)
  437.             self.keyboard_hook = False
  438.  
  439.     
  440.     def MouseSwitch(self, msg, x, y, data, flags, time, hwnd, window_name):
  441.         '''
  442.     Passes a mouse event on to the appropriate handler if one is registered.
  443.  
  444.     @param msg: Message value
  445.     @type msg: integer
  446.     @param x: x-coordinate of the mouse event
  447.     @type x: integer
  448.     @param y: y-coordinate of the mouse event
  449.     @type y: integer
  450.     @param data: Data associated with the mouse event (scroll information)
  451.     @type data: integer
  452.     @param flags: Flags associated with the mouse event (injected or not)
  453.     @type flags: integer
  454.     @param time: Seconds since the epoch when the even current
  455.     @type time: integer
  456.     @param hwnd: Window handle of the foreground window at the time of the event
  457.     @type hwnd: integer
  458.     '''
  459.         event = MouseEvent(msg, x, y, data, flags, time, hwnd, window_name)
  460.         func = self.mouse_funcs.get(msg)
  461.         if func:
  462.             return func(event)
  463.         return None
  464.  
  465.     
  466.     def KeyboardSwitch(self, msg, vk_code, scan_code, ascii, flags, time, hwnd, win_name):
  467.         '''
  468.     Passes a keyboard event on to the appropriate handler if one is registered.
  469.  
  470.     @param msg: Message value
  471.     @type msg: integer
  472.     @param vk_code: The virtual keycode of the key
  473.     @type vk_code: integer
  474.     @param scan_code: The scan code of the key
  475.     @type scan_code: integer
  476.     @param ascii: ASCII numeric value for the key if available
  477.     @type ascii: integer
  478.     @param flags: Flags associated with the key event (injected or not, extended key, etc.)
  479.     @type flags: integer
  480.     @param time: Time since the epoch of the key event
  481.     @type time: integer
  482.     @param hwnd: Window handle of the foreground window at the time of the event
  483.     @type hwnd: integer
  484.     '''
  485.         event = KeyboardEvent(msg, vk_code, scan_code, ascii, flags, time, hwnd, win_name)
  486.         func = self.keyboard_funcs.get(msg)
  487.         if func:
  488.             return func(event)
  489.         return None
  490.  
  491.     
  492.     def SubscribeMouseMove(self, func):
  493.         '''
  494.     Registers the given function as the callback for this mouse event type. Use the
  495.     MouseMove property as a shortcut.
  496.  
  497.     @param func: Callback function
  498.     @type func: callable
  499.     '''
  500.         if func is None:
  501.             self.disconnect(self.mouse_funcs, HookConstants.WM_MOUSEMOVE)
  502.         else:
  503.             self.connect(self.mouse_funcs, HookConstants.WM_MOUSEMOVE, func)
  504.  
  505.     
  506.     def SubscribeMouseLeftUp(self, func):
  507.         '''
  508.     Registers the given function as the callback for this mouse event type. Use the
  509.     MouseLeftUp property as a shortcut.
  510.  
  511.     @param func: Callback function
  512.     @type func: callable
  513.     '''
  514.         if func is None:
  515.             self.disconnect(self.mouse_funcs, HookConstants.WM_LBUTTONUP)
  516.         else:
  517.             self.connect(self.mouse_funcs, HookConstants.WM_LBUTTONUP, func)
  518.  
  519.     
  520.     def SubscribeMouseLeftDown(self, func):
  521.         '''
  522.     Registers the given function as the callback for this mouse event type. Use the
  523.     MouseLeftDown property as a shortcut.
  524.  
  525.     @param func: Callback function
  526.     @type func: callable
  527.     '''
  528.         if func is None:
  529.             self.disconnect(self.mouse_funcs, HookConstants.WM_LBUTTONDOWN)
  530.         else:
  531.             self.connect(self.mouse_funcs, HookConstants.WM_LBUTTONDOWN, func)
  532.  
  533.     
  534.     def SubscribeMouseLeftDbl(self, func):
  535.         '''
  536.     Registers the given function as the callback for this mouse event type. Use the
  537.     MouseLeftDbl property as a shortcut.
  538.  
  539.     @param func: Callback function
  540.     @type func: callable
  541.     '''
  542.         if func is None:
  543.             self.disconnect(self.mouse_funcs, HookConstants.WM_LBUTTONDBLCLK)
  544.         else:
  545.             self.connect(self.mouse_funcs, HookConstants.WM_LBUTTONDBLCLK, func)
  546.  
  547.     
  548.     def SubscribeMouseRightUp(self, func):
  549.         '''
  550.     Registers the given function as the callback for this mouse event type. Use the
  551.     MouseRightUp property as a shortcut.
  552.  
  553.     @param func: Callback function
  554.     @type func: callable
  555.     '''
  556.         if func is None:
  557.             self.disconnect(self.mouse_funcs, HookConstants.WM_RBUTTONUP)
  558.         else:
  559.             self.connect(self.mouse_funcs, HookConstants.WM_RBUTTONUP, func)
  560.  
  561.     
  562.     def SubscribeMouseRightDown(self, func):
  563.         '''
  564.     Registers the given function as the callback for this mouse event type. Use the
  565.     MouseRightDown property as a shortcut.
  566.  
  567.     @param func: Callback function
  568.     @type func: callable
  569.     '''
  570.         if func is None:
  571.             self.disconnect(self.mouse_funcs, HookConstants.WM_RBUTTONDOWN)
  572.         else:
  573.             self.connect(self.mouse_funcs, HookConstants.WM_RBUTTONDOWN, func)
  574.  
  575.     
  576.     def SubscribeMouseRightDbl(self, func):
  577.         '''
  578.     Registers the given function as the callback for this mouse event type. Use the
  579.     MouseRightDbl property as a shortcut.
  580.  
  581.     @param func: Callback function
  582.     @type func: callable
  583.     '''
  584.         if func is None:
  585.             self.disconnect(self.mouse_funcs, HookConstants.WM_RBUTTONDBLCLK)
  586.         else:
  587.             self.connect(self.mouse_funcs, HookConstants.WM_RBUTTONDBLCLK, func)
  588.  
  589.     
  590.     def SubscribeMouseMiddleUp(self, func):
  591.         '''
  592.     Registers the given function as the callback for this mouse event type. Use the
  593.     MouseMiddleUp property as a shortcut.
  594.  
  595.     @param func: Callback function
  596.     @type func: callable
  597.     '''
  598.         if func is None:
  599.             self.disconnect(self.mouse_funcs, HookConstants.WM_MBUTTONUP)
  600.         else:
  601.             self.connect(self.mouse_funcs, HookConstants.WM_MBUTTONUP, func)
  602.  
  603.     
  604.     def SubscribeMouseMiddleDown(self, func):
  605.         '''
  606.     Registers the given function as the callback for this mouse event type. Use the
  607.     MouseMiddleDown property as a shortcut.
  608.  
  609.     @param func: Callback function
  610.     @type func: callable
  611.     '''
  612.         if func is None:
  613.             self.disconnect(self.mouse_funcs, HookConstants.WM_MBUTTONDOWN)
  614.         else:
  615.             self.connect(self.mouse_funcs, HookConstants.WM_MBUTTONDOWN, func)
  616.  
  617.     
  618.     def SubscribeMouseMiddleDbl(self, func):
  619.         '''
  620.     Registers the given function as the callback for this mouse event type. Use the
  621.     MouseMiddleDbl property as a shortcut.
  622.  
  623.     @param func: Callback function
  624.     @type func: callable
  625.     '''
  626.         if func is None:
  627.             self.disconnect(self.mouse_funcs, HookConstants.WM_MBUTTONDBLCLK)
  628.         else:
  629.             self.connect(self.mouse_funcs, HookConstants.WM_MBUTTONDBLCLK, func)
  630.  
  631.     
  632.     def SubscribeMouseWheel(self, func):
  633.         '''
  634.     Registers the given function as the callback for this mouse event type. Use the
  635.     MouseWheel property as a shortcut.
  636.  
  637.     @param func: Callback function
  638.     @type func: callable
  639.     '''
  640.         if func is None:
  641.             self.disconnect(self.mouse_funcs, HookConstants.WM_MOUSEWHEEL)
  642.         else:
  643.             self.connect(self.mouse_funcs, HookConstants.WM_MOUSEWHEEL, func)
  644.  
  645.     
  646.     def SubscribeMouseAll(self, func):
  647.         '''
  648.     Registers the given function as the callback for all mouse events. Use the
  649.     MouseAll property as a shortcut.
  650.  
  651.     @param func: Callback function
  652.     @type func: callable
  653.     '''
  654.         self.SubscribeMouseMove(func)
  655.         self.SubscribeMouseWheel(func)
  656.         self.SubscribeMouseAllButtons(func)
  657.  
  658.     
  659.     def SubscribeMouseAllButtons(self, func):
  660.         '''
  661.     Registers the given function as the callback for all mouse button events. Use the
  662.     MouseButtonAll property as a shortcut.
  663.  
  664.     @param func: Callback function
  665.     @type func: callable
  666.     '''
  667.         self.SubscribeMouseAllButtonsDown(func)
  668.         self.SubscribeMouseAllButtonsUp(func)
  669.         self.SubscribeMouseAllButtonsDbl(func)
  670.  
  671.     
  672.     def SubscribeMouseAllButtonsDown(self, func):
  673.         '''
  674.     Registers the given function as the callback for all mouse button down events.
  675.     Use the MouseAllButtonsDown property as a shortcut.
  676.  
  677.     @param func: Callback function
  678.     @type func: callable
  679.     '''
  680.         self.SubscribeMouseLeftDown(func)
  681.         self.SubscribeMouseRightDown(func)
  682.         self.SubscribeMouseMiddleDown(func)
  683.  
  684.     
  685.     def SubscribeMouseAllButtonsUp(self, func):
  686.         '''
  687.     Registers the given function as the callback for all mouse button up events.
  688.     Use the MouseAllButtonsUp property as a shortcut.
  689.  
  690.     @param func: Callback function
  691.     @type func: callable
  692.     '''
  693.         self.SubscribeMouseLeftUp(func)
  694.         self.SubscribeMouseRightUp(func)
  695.         self.SubscribeMouseMiddleUp(func)
  696.  
  697.     
  698.     def SubscribeMouseAllButtonsDbl(self, func):
  699.         '''
  700.     Registers the given function as the callback for all mouse button double click
  701.     events. Use the MouseAllButtonsDbl property as a shortcut.
  702.  
  703.     @param func: Callback function
  704.     @type func: callable
  705.     '''
  706.         self.SubscribeMouseLeftDbl(func)
  707.         self.SubscribeMouseRightDbl(func)
  708.         self.SubscribeMouseMiddleDbl(func)
  709.  
  710.     
  711.     def SubscribeKeyDown(self, func):
  712.         '''
  713.     Registers the given function as the callback for this keyboard event type.
  714.     Use the KeyDown property as a shortcut.
  715.  
  716.     @param func: Callback function
  717.     @type func: callable
  718.     '''
  719.         if func is None:
  720.             self.disconnect(self.keyboard_funcs, HookConstants.WM_KEYDOWN)
  721.             self.disconnect(self.keyboard_funcs, HookConstants.WM_SYSKEYDOWN)
  722.         else:
  723.             self.connect(self.keyboard_funcs, HookConstants.WM_KEYDOWN, func)
  724.             self.connect(self.keyboard_funcs, HookConstants.WM_SYSKEYDOWN, func)
  725.  
  726.     
  727.     def SubscribeKeyUp(self, func):
  728.         '''
  729.     Registers the given function as the callback for this keyboard event type.
  730.     Use the KeyUp property as a shortcut.
  731.  
  732.     @param func: Callback function
  733.     @type func: callable
  734.     '''
  735.         if func is None:
  736.             self.disconnect(self.keyboard_funcs, HookConstants.WM_KEYUP)
  737.             self.disconnect(self.keyboard_funcs, HookConstants.WM_SYSKEYUP)
  738.         else:
  739.             self.connect(self.keyboard_funcs, HookConstants.WM_KEYUP, func)
  740.             self.connect(self.keyboard_funcs, HookConstants.WM_SYSKEYUP, func)
  741.  
  742.     
  743.     def SubscribeKeyChar(self, func):
  744.         '''
  745.     Registers the given function as the callback for this keyboard event type.
  746.     Use the KeyChar property as a shortcut.
  747.  
  748.     B{Note}: this is currently non-functional, no WM_*CHAR messages are
  749.     processed by the keyboard hook.
  750.  
  751.     @param func: Callback function
  752.     @type func: callable
  753.     '''
  754.         if func is None:
  755.             self.disconnect(self.keyboard_funcs, HookConstants.WM_CHAR)
  756.             self.disconnect(self.keyboard_funcs, HookConstants.WM_DEADCHAR)
  757.             self.disconnect(self.keyboard_funcs, HookConstants.WM_SYSCHAR)
  758.             self.disconnect(self.keyboard_funcs, HookConstants.WM_SYSDEADCHAR)
  759.         else:
  760.             self.connect(self.keyboard_funcs, HookConstants.WM_CHAR, func)
  761.             self.connect(self.keyboard_funcs, HookConstants.WM_DEADCHAR, func)
  762.             self.connect(self.keyboard_funcs, HookConstants.WM_SYSCHAR, func)
  763.             self.connect(self.keyboard_funcs, HookConstants.WM_SYSDEADCHAR, func)
  764.  
  765.     
  766.     def SubscribeKeyAll(self, func):
  767.         '''
  768.     Registers the given function as the callback for all keyboard events.
  769.     Use the KeyAll property as a shortcut.
  770.  
  771.     @param func: Callback function
  772.     @type func: callable
  773.     '''
  774.         self.SubscribeKeyDown(func)
  775.         self.SubscribeKeyUp(func)
  776.         self.SubscribeKeyChar(func)
  777.  
  778.     MouseAll = property(fset = SubscribeMouseAll)
  779.     MouseAllButtons = property(fset = SubscribeMouseAllButtons)
  780.     MouseAllButtonsUp = property(fset = SubscribeMouseAllButtonsUp)
  781.     MouseAllButtonsDown = property(fset = SubscribeMouseAllButtonsDown)
  782.     MouseAllButtonsDbl = property(fset = SubscribeMouseAllButtonsDbl)
  783.     MouseWheel = property(fset = SubscribeMouseWheel)
  784.     MouseMove = property(fset = SubscribeMouseMove)
  785.     MouseLeftUp = property(fset = SubscribeMouseLeftUp)
  786.     MouseLeftDown = property(fset = SubscribeMouseLeftDown)
  787.     MouseLeftDbl = property(fset = SubscribeMouseLeftDbl)
  788.     MouseRightUp = property(fset = SubscribeMouseRightUp)
  789.     MouseRightDown = property(fset = SubscribeMouseRightDown)
  790.     MouseRightDbl = property(fset = SubscribeMouseRightDbl)
  791.     MouseMiddleUp = property(fset = SubscribeMouseMiddleUp)
  792.     MouseMiddleDown = property(fset = SubscribeMouseMiddleDown)
  793.     MouseMiddleDbl = property(fset = SubscribeMouseMiddleDbl)
  794.     KeyUp = property(fset = SubscribeKeyUp)
  795.     KeyDown = property(fset = SubscribeKeyDown)
  796.     KeyChar = property(fset = SubscribeKeyChar)
  797.     KeyAll = property(fset = SubscribeKeyAll)
  798.     
  799.     def connect(self, switch, id, func):
  800.         '''
  801.     Registers a callback to the given function for the event with the given ID in the
  802.     provided dictionary. Internal use only.
  803.  
  804.     @param switch: Collection of callbacks
  805.     @type switch: dictionary
  806.     @param id: Event type
  807.     @type id: integer
  808.     @param func: Callback function
  809.     @type func: callable
  810.     '''
  811.         switch[id] = func
  812.  
  813.     
  814.     def disconnect(self, switch, id):
  815.         '''
  816.     Unregisters a callback for the event with the given ID in the provided dictionary.
  817.     Internal use only.
  818.  
  819.     @param switch: Collection of callbacks
  820.     @type switch: dictionary
  821.     @param id: Event type
  822.     @type id: integer
  823.     '''
  824.         
  825.         try:
  826.             del switch[id]
  827.         except:
  828.             pass
  829.  
  830.  
  831.  
  832.